/**
 * 学习目标：使用受控组件，实现双向绑定的效果
 * 类似：vue中v-model， :value, @input
 * 用处：收集用户输入的内容
 * 两个关键点：
 *  1. 表单元素的值，由state控制
 *  2. onChange配合setState修改state的值
 */

import React from 'react';
//通过解构的方式解构出来createRoot
import { createRoot } from 'react-dom/client';

class App extends React.Component {
  state = {
    name: '马云',
    desc: '',
    city: '深圳',
    isSingle: true,
  };
  handleChange = (e) => {
    // 通过事件对象获取value值
    console.log('e----->', e);
    // 解构代码
    const { name, type, checked, value } = e.target;
    this.setState({
      // name: e.target.value,
      // 判断type类型是否为checkbox，是则获取checked
      [name]: type === 'checkbox' ? checked : value,
    });
  };
  render() {
    // 解构属性方便使用
    const { name, desc, city, isSingle } = this.state;
    return (
      <div>
        姓名：
        <input
          name="name"
          type="text"
          value={name}
          onChange={this.handleChange}
        />
        <br />
        描述：
        <textarea
          name="desc"
          placeholder="请输入文本"
          value={desc}
          onChange={this.handleChange}
        ></textarea>
        <br />
        城市：
        <select name="city" value={city} onChange={this.handleChange}>
          <option value="北京">北京</option>
          <option value="上海">上海</option>
          <option value="广州">广州</option>
          <option value="深圳">深圳</option>
        </select>
        <br />
        是否单身：
        <input
          name="isSingle"
          type="checkbox"
          checked={isSingle}
          onChange={this.handleChange}
        />
      </div>
    );
  }
}

// 这是React18版本新出的挂载节点的方法
const root = createRoot(document.getElementById('root'));
root.render(<App></App>);
